#include "../corelib/util/string_util.hh"
#include "unittest/unittest.hh"
#include <cstring>
#include <cstdlib>
#include <chrono>

using namespace kratos::corelib;

FIXTURE_BEGIN(StringUtil)

CASE(TestEndWith) {
    ASSERT_TRUE(StringUtil::endWith("abc123", "123"));
    ASSERT_TRUE(StringUtil::endWith("abc123", "23"));
    ASSERT_TRUE(StringUtil::endWith("abc123", "3"));
    ASSERT_FALSE(StringUtil::endWith("abc123", "12"));
    ASSERT_FALSE(StringUtil::endWith("abc123", "1"));
    ASSERT_FALSE(StringUtil::endWith("abc123", "a"));
    ASSERT_FALSE(StringUtil::endWith("abc123", "ab"));
    ASSERT_FALSE(StringUtil::endWith("abc123", "abc"));
    ASSERT_FALSE(StringUtil::endWith("abc123", "b"));
    ASSERT_FALSE(StringUtil::endWith("abc123", "c"));
}

CASE(TestStartWith) {
    ASSERT_TRUE(StringUtil::startWith("abc123", "abc"));
    ASSERT_TRUE(StringUtil::startWith("abc123", "ab"));
    ASSERT_TRUE(StringUtil::startWith("abc123", "a"));
    ASSERT_FALSE(StringUtil::startWith("abc123", "b"));
    ASSERT_FALSE(StringUtil::startWith("abc123", "c"));
    ASSERT_FALSE(StringUtil::startWith("abc123", "123"));
}

CASE(TestRemove) {
    ASSERT_TRUE("123" == StringUtil::remove("abc123", "abc"));
    ASSERT_TRUE("abc" == StringUtil::remove("abc123", "123"));
    ASSERT_TRUE("a123" == StringUtil::remove("abc123", "bc"));
    ASSERT_TRUE("abc123" == StringUtil::remove("abc123", ""));
}

CASE(TestTrim) {
    ASSERT_TRUE("abc123" == StringUtil::trim("   abc123"));
    ASSERT_TRUE("abc123" == StringUtil::trim("\t abc123 \t", " \t"));
    ASSERT_TRUE("abc123 " == StringUtil::ltrim("   abc123 "));
    ASSERT_TRUE(" abc123" == StringUtil::rtrim(" abc123  "));
}

CASE(TestReplace) {
    ASSERT_TRUE("aaa123" == StringUtil::replace("abc123", "bc", "aa"));
}

FIXTURE_END(StringUtil)
